package com.zisu.springbootsource.event;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 93938
 */
@Component
public abstract class AbstractEventMulticaster implements EventMulticaster{
    //注意重点（如果在某个调用类中 Autowire 一个List<接口类>，，那么实现这个接口类 的那些impl类 都会被初始化，，并且List<WeatherListener> 中就是前面初始化的类。）
    //当 WeatherListener（interface类）下的RainListener 和 SnowListener（实现类） 都加上了 @Component注解，那么在系统启动的时候spring都会将这两个类初始化。
    // 并且在这里@Autowired 了一个List<WeatherListener> 说明，并不是 调用addListener这个方法 进去的。
    @Autowired
    private List<WeatherListener> listenerList;

    /*private List<WeatherListener> listenerList = new ArrayList<>();*/

    //广播器 广播事件
    @Override
    public void multicastEvent(WeatherEvent event) {
        doStart();
        listenerList.forEach(i->i.onWeatherEvent(event));
        doEnd();
    }

    protected abstract void doEnd();

    protected abstract void doStart();

    @Override
    public void addListener(WeatherListener weatherListener) {
        listenerList.add(weatherListener);
    }

    @Override
    public void removeListener(WeatherListener weatherListener) {
        listenerList.remove(weatherListener);
    }
}
